#include<stdio.h>
#include<stdbool.h>
#include "MyString.h"

// size t Mystrlen(const char*s)
// void MyStrcpy(char *dest,const char *src)
// void MyStrncpy(char *dest,const char *src,size t n)
// int Mystrcmp(const char *sl,const char* s2)….

size_t MyStrlen(const char*s)
{
    size_t count=0;
    while(*s++ !='\0')
    {
        count++;   
    }
    return count;
}

void MyStrcpy(char *dest,const char *src)
{
    while(*src!='\0')
    *dest++ = *src++;
    *dest = '\0';
}


void MyStrncpy(char *dest,const char *src ,size_t n)
{
   while(*src !='\0'&& n-- != 0)
    {
        *dest++ = *src++;
    }
    *dest  ='\0';
}

// int MyStrcmp(const char * s1,const char* s2)
// {
//     while(*s1==*2&&*s1!='\0'&&*s2!='\0')
//     {
//         s1++;
//         s2++;
//     }
//     return *s1-*s2;
// }

#define Min(a,b) (a)<(b)?a:b
int MyStrcmp(const char * s1,const char* s2,size_t n)
{
    size_t minLen = Min(Min(MyStrlen(s1),MyStrlen(s2)),n);
    while(*s1==*s2 && minLen-- !=1)
    {
        s1++;
        s2++;
        minLen--;
    }
    return *s1-*s2;
}
    // else
    // {
    //     return MyStrcmp(s1,s2);
    // }



void MyStrcat(char *dest,const char *src)
{
    MyStrcpy(dest + MyStrlen(dest),src);
}

void MyStrncat(char *dest,const char *src,size_t n)
{
    MyStrncpy(dest+MyStrlen(dest),src,n);
}


char *MyStrstr(char *dest,const char *src)
{
    size_t dien=MyStrlen(dest);
    size_t slen=MyStrlen(src);
    for(int i=0;i<MyStrlen(dest)-MyStrlen(src);i++)
    {
        if(MyStrcmp(dest+i,src,MyStrlen(src))==0)
        {
            return dest+i;
        }
    }
    return NULL;

}

bool IsHavechar(const char *s,char c)
{
    while(*s != '\0')
    {
        if(*s == c)
        return true;
        s++;
    }
    return false;
}

char* MyStrtok(char *src,const char *delim)
{
    //上一次切割完的下一个字符串的
    static char *nextStr=NULL;
    if(src==NULL)//想要继续切割上一次的字符串
        src=nextStr;
    if(src==NULL)
        return NULL;

    //跳过所有的分割符
    while(*src !='\0')
    {
        if(IsHavechar(delim,*src)==true)
        {
            src++;
        }
        else
            break;//找到了第一个不是分隔符的位置
    }
    if(*src=='\0')
        return NULL;
    //src:有效字符串的首地址
    //找下一个分隔符
    char *end =src;
    while(*end !='\0')
    {
        if(IsHavechar(delim,*end)==true)
        {  
            break;
        }
        else
        end++;
    }
    if(*end=='\0')
    {
        nextStr=NULL;
    }
    else
    {
        *end='\0';
        nextStr=end+1;
    }

    return src;
}



int main()
{
    //printf("%ld\n",MyStrlen("helloworld"));
    // const char * s = "hello";
    // char str[6]={0};
    // MyStrcpy(str,s,3);
    // printf("%s\n",str);
    // return 0;
    // char str[20]="hellowworld";
    // const char *s="llo";
    // char *a=MyStrstr(str,s);
    // printf("%s\n", a);

    char str[]="zhangsan,lisi.wangwu";
    char *s = MyStrtok(str,",.");
    while(s != NULL)
    {
        printf("%s\n",s);
        s = MyStrtok(NULL,",.");
    }

    return 0;
}

MyString::~MyString()
{
}

